import { useUserInfoStore } from '@/stores/userInfo'
import axios, { type Method } from 'axios'
import { ElMessage } from 'element-plus'

const instance = axios.create({
  baseURL: import.meta.env.VITE_API_URL,
  timeout: 5000
})

// 添加请求拦截器
instance.interceptors.request.use(
  function (config) {
    // 在发送请求之前做些什么
    return config
  },
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)

// 添加响应拦截器
instance.interceptors.response.use(
  function (response) {
    // 1.对服务器返回数据简化
    const res = response.data
    // 200或20000状态码的时候，响应成功
    if (res.code !== 200 && res.code !== 20000) {
      // 异常
      if (res.code === 20001) {
        // token失效
        ElMessage({
          message: 'token失效，请重新登录',
          type: 'warning',
          // 显示时间
          duration: 5000
        })
        // 清空本地用户数据
        // 跳转到登录页面，刷新数据
        const userStore = useUserInfoStore()
        userStore.reset()
        // 刷新数据
        // location.reload()
      } else {
        // 其他错误
        ElMessage({
          message: res.message,
          type: 'warning',
          // 显示时间
          duration: 5000
        })
      }
      // 扔出错误，将错误传递
      return Promise.reject(new Error(res.message))
    } else {
      // 成功
      return res
    }
  },
  function (error) {
    // 1.请求超时
    // 2.http状态码不是以200开头
    ElMessage({
      message: '请求超时，网络错误',
      type: 'warning',
      // 显示时间
      duration: 5000
    })
    return Promise.reject(error)
  }
)

// 定义公共接口
export interface IReqLoginRes<T> {
  code: number
  data: T
  message: string
  success: boolean
}
// 封装公共的请求数据的方法
function http<T>(url: string, method: Method, submitData: unknown) {
  // 将请求方式全部转化为大写
  const newMethod = method.toUpperCase()
  return instance.request<T, IReqLoginRes<T>>({
    url,
    method: newMethod,
    data: newMethod === 'POST' || newMethod === 'PUT' ? submitData : {}, //为post和put的时候传递参数为data
    params: newMethod === 'GET' || newMethod === 'DELETE' ? submitData : {} //为get和delete的时候传递的参数为params
  })
}
// 为什么按需导出，因为待会还会封装一个方法
export { instance, http }
